import re

from django.shortcuts import render

# Create your views here.

"""
判断用户是否重复的功能

前端: 当用户输入用户名之后,失去焦点,发送一个axios请求

后端(思路):
    请求:     接收用户名
    逻辑:
            - 根据用户名查询数据库,如果查询结果数量等于0,说明没有重复,可以注册
            - 如果查询结果数量等于1,说明有注册
    响应:     JSON
            {code:0, count:0/1, errmsg:ok}
    路由:     GET     usernames/<username>/count/
    步骤:
            1.接收用户名
            2.根据用户名查询数据库
            3.返回响应
"""

# 步骤:
from django.http import JsonResponse
from django.views import View
from .models import *


class UsernameCountView(View):

    def get(self,request, username):
#         1.接收用户名

#         2.根据用户名查询数据库
        count = User.objects.filter(username=username).count()
#         3.返回响应
        return JsonResponse({
            'code':0,
            'count':count,
            'errmsg':'ok'
        })

########################################################
"""
我们不相信前端提交的任何数据
前端:     当用户输入用户名,密码,确认密码,手机号,是否同意协议,之后,会点击注册按钮
            前端发送axios请求

后端:
    请求:     接收请求json,获取数据(post->json)
    逻辑:     验证数据,数据入库
    响应:     json{'code':0,errmsg:'ok'}
             0:成功   400:失败
    路由:     post    register/
    步骤:
        # 1.接收请求 (post->json)
        # 2.获取数据
        # 3.验证数据
        #     3.1 用户名,密码,确认密码,手机号,是否同意协议,都要进行验证
        #     3.2 用户名满足规则,用户名不能重复
        #     3.3 密码满足规则
        #     3.4 确认密码和密码要一致
        #     3.5 手机号满足规则,手机号也不能重复
        #     3.6 需要同意协议
        # 4.数据入库
        # 5.并实现状态保持
        # 6.返回响应
    
"""
import json
class RegisterView(View):
    def post(self,request):
        # 1.接收请求 (post->json)
        body_bytes = request.body
        body_str = body_bytes.decode()
        body_dict = json.loads(body_str)
        # 2.获取数据
        username = body_dict.get('username')
        password = body_dict.get('password')
        password2 = body_dict.get('password2')
        mobile = body_dict.get('mobile')
        allow = body_dict.get('allow')
        # 3.验证数据
        #     3.1 用户名,密码,确认密码,手机号,是否同意协议,都要进行验证(参数是否齐全)
        if not all([username, password, password2, mobile, allow]):
            return JsonResponse({'code':400, 'errmsg':'参数不齐全'})
        #     3.2 用户名满足规则,用户名不能重复
        if not re.match('[a-zA-Z0-9_-]{5,20}', username):
            return JsonResponse({'code':400, 'errmsg':'用户名不符合规则'})
        count_username = User.objects.filter(username=username).count()
        if count_username:
            return JsonResponse({'code':400,'errmsg':'用户名已经存在'})
        #     3.3 密码满足规则8-20位
        if not re.match('[a-zA-Z0-9_-]{8,20}', password):
            return JsonResponse({'code':400,'errmsg':'密码必须在8-20之间'})
        #     3.4 确认密码和密码要一致
        if not re.match('[a-zA-Z0-9_-]{8,20}', password2):
            return JsonResponse({'code':400,'errmsg':'密码必须在8-20之间'})
        if password != password2:
            return JsonResponse({'code':400,'errmsg':'密码输入不一致,请重新输入'})
        #     3.5 手机号满足规则,手机号也不能重复
        if not re.match('^1[345789]\d{9}$',mobile):
            return JsonResponse({'code':400,'errmsg':'手机号不符合规则'})
        count_mobile = User.objects.filter(mobile=mobile).count()
        if count_mobile:
            return JsonResponse({'code':400,'errmsg':'手机号已经存在'})
        #     3.6 需要同意协议
        # 4.数据入库
        user = User.objects.create_user(username=username,password=password,mobile=mobile)
        # 5.实现状态保持
        from django.contrib.auth import login
        login(request,user)
        # 5.返回响应
        return JsonResponse({'code':0,'errmsg':'ok'})


"""
我们不相信前端提交的任何数据
前端: 用户点击登录后,会传过来用户名或手机号,密码,记住登录等信息
        路径:http://www.meiduo.site:8080/login.html
         axios.post(this.host + '/login/', {
                    username: this.username,
                    password: this.password,
                    remembered:this.remember,
                }
         // 获取cookie中的用户名
    	this.username = getCookie('username');       

后端:
    请求:         POST /login/  
    业务逻辑:     进行验证/保存session/实现跳转/
    响应:         json    0:成功    400失败
    步骤:
        # 1.接收数据 post->json
        # 2.验证数据
        # 3.验证用户名/手机号和密码是否正确
        # 4.保存session
        # 5.判断是否记住登录
        # 6.记住登陆信息 
        # 7.返回响应
"""
class LoginView(View):
    def post(self,request):
        # 1.接收数据
        data = json.loads(request.body.decode())
        username = data.get('username')
        password = data.get('password')
        remembered = data.get('remembered')

        # 2.验证数据
        if not all([username,password]):
            return JsonResponse({'code':400, 'errmsg':'参数不齐全'})

        # 判断username是否是手机号,可以通过User.USERNAME_FIELD  来确定
        if re.match('1[3-9]\d{9}',username):
            User.USERNAME_FIELD = 'mobile'
        else:
            User.USERNAME_FIELD = 'username'
        # 3.验证用户名/手机号和密码是否正确
        from django.contrib.auth import authenticate
        user = authenticate(username=username,password=password)
        # 4.保存session
        if user is None:
            return JsonResponse({'code':400,'errmsg':'账号或密码错误'})
        # 5.判断是否记住登录
        if remembered:
            request.session.set_expiry(None)
        else:
            request.session.set_expiry(0)
        response = JsonResponse({'code':0,'errmsg':'ok'})
        # 6.绑定cookies,首页显示用户信息
        response.set_cookie('username', username)
        # 7.返回响应
        return response

"""
前端:当用户点击退出按钮,发送axios请求
    // 退出登录按钮
        logoutfunc: function () {
            var url = this.host + '/logout/';
            axios.delete(url, {
                responseType: 'json', # 返回json
                withCredentials:true, # 携带cookies
            })
                .then(response => {
                    location.href = 'login.html';
                })
                .catch(error => {
                    console.log(error.response);
                })
        },
    

后端
    请求:         GET     /logout/
    业务逻辑:     退出登录
    返回响应:     json 
    步骤: 
        # 1. 删除session信息
        # 2. 删除cookie信息      
"""
from django.contrib.auth import logout
class LogoutView(View):
    def delete(self,request):
        # 1. 删除session信息
        logout(request)
        # 2. 删除cookie信息
        response = JsonResponse({'code':0,'errmsg':'ok'})
        response.delete_cookie('username')
        return response


from utils.views import LoginRequiredJSONMixin


class CenterView(LoginRequiredJSONMixin,View):
    def get(self,request):
        return JsonResponse({'code':0,'errmsg':'ok'})